/**
 * 给定N凸多边形，选择逆时针选择三个点A/B/C
 * 其中从B到C逆时针固定相差K条边，A可以随意选。
 * AB、B到C的K条边、以及CA构成一个(K+2)边形，求该面积最大
 * 其中A可以与B或者C重合
 * 很明显旋转卡壳法，O(N)可以完成
 * 但是要注意A必须在C/B之间，因此转动的时候需要注意
 * 旋转卡壳法实际上相当于尺取法，也可以用三分搜索在O(NlogN)完成
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using Real = double;
using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;

struct Point{
    llt x;
    llt y;
};

llt cross(const Point & O, const Point & A, const Point & B){
    llt xoa = A.x - O.x, yoa = A.y - O.y;
    llt xob = B.x - O.x, yob = B.y - O.y;
    return xoa * yob - xob * yoa;
}

int N, K;
vector<Point> Con;

llt proc(){
    llt level = 0;
    for(int i=1;i+1<=K;++i){
        level += cross(Con[0], Con[i], Con[i+1]);
    }

    llt ans = 0;
    int a;
    for(int b=0,c=K,a=K;b<N;++b,c=(c+1)%N){
        const auto & pb = Con[b];
        const auto & pc = Con[c];
        while(a!=b and cross(pb, pc, Con[a]) < cross(pb, pc, Con[(a+1)%N])) a = (a+1)%N;

        ans = max(ans, level + cross(pb, pc, Con[a]));
        level += cross(pb, pc, Con[(c+1)%N]);
        level -= cross(pb, Con[(b+1)%N], Con[(c+1)%N]);
        if(a == c) a = (a + 1) % N; // 这一步很重要，没有就wa
    }

    return ans;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofakse = 1;
    cin >> nofakse;
    while(nofakse--){
        cin >> N >> K;
        Con.assign(N, {});
        for(auto & p : Con){
            int x, y; cin >> x >> y;
            p.x = x; p.y = y;
        }
        auto ans = proc();
        long double t = ans / 2.L;
        cout << fixed << setprecision(12) << t << "\n";
    }
    return 0;
}